﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Torneo.DataAccess;
using Torneo.Entidades;
using System.Data;

namespace Torneo.Repository
{
    public class EmparejamientoRepository : IEmparejamientoRepository
    {
        private TorneoDbContext _context;

        public EmparejamientoRepository(TorneoDbContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("Null Context");
            }

            this._context = context;            
        }

        public Emparejamiento ObtenerEmparejamientoPorId(int id)
        {
            return _context.Emparejamientos.Include("JugadorA").Include("JugadorB").SingleOrDefault(x => x.EmparejamientoId == id);
        }

        public IList<Entidades.Emparejamiento> ObtenerTodos()
        {
            IList<Entidades.Emparejamiento> list = _context.Emparejamientos.Include("JugadorA").Include("JugadorB").ToList();
            return list;
        }

        public void AgregarEmparejamiento(Emparejamiento emparejamiento)
        {
            _context.Jugadores.Attach(emparejamiento.JugadorA);
            _context.Jugadores.Attach(emparejamiento.JugadorB);
            _context.Entry(emparejamiento).State = EntityState.Unchanged;            
            _context.Emparejamientos.Add(emparejamiento);
            _context.SaveChanges();
        }

        public void EliminarEmparejamiento(Emparejamiento emparejamiento)
        {
            var empareja = ObtenerEmparejamientoPorId(emparejamiento.EmparejamientoId);
            _context.Emparejamientos.Remove(empareja);
            _context.SaveChanges();
        }

        public void ModificarEmparejamiento(Emparejamiento emparejamiento)
        {
            _context.Emparejamientos.Attach(emparejamiento);
            _context.Entry(emparejamiento).State = EntityState.Modified;
            _context.SaveChanges();
        }

        public IList<Emparejamiento> ObtenerEmparejamientosSinResultado(int fase)
        {
            var query = from item in _context.Emparejamientos.Include("JugadorA").Include("JugadorB")
                        where (item.Fase == fase) && !(from res in _context.Resultados
                                    select res.Emparejamiento.EmparejamientoId).Contains(item.EmparejamientoId)
                        select item;

            return query.ToList<Entidades.Emparejamiento>();
        }
    }
}
